package cn.wu.reggie.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.wu.reggie.common.Page;
import cn.wu.reggie.common.R;
import cn.wu.reggie.dto.SetmealDto;
import cn.wu.reggie.entity.Category;
import cn.wu.reggie.entity.Setmeal;
import cn.wu.reggie.entity.SetmealDish;
import cn.wu.reggie.exception.BusinessException;
import cn.wu.reggie.mapper.CategoryMapper;
import cn.wu.reggie.mapper.SetmealDishMapper;
import cn.wu.reggie.mapper.SetmealMapper;
import cn.wu.reggie.service.SetmealService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class SetmealServiceImpl implements SetmealService {

    @Autowired
    private SetmealMapper setmealMapper;

    @Autowired
    private SetmealDishMapper setmealDishMapper;

    @Autowired
    private CategoryMapper categoryMapper;

    @Override
    @Transactional
    public R save(SetmealDto setmealDto) {
        // 1 保存setmeal
        // 设置时间
        setmealDto.setCreateTime(LocalDateTime.now());
        setmealDto.setUpdateTime(setmealDto.getCreateTime());
        // 调用mapper 保存setmeal套餐基本信息 返回主键
        setmealMapper.save(setmealDto);

        // 2 批量保存套餐中的菜品
        // 2.1 获取套餐中的菜品集合
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        // 2.2 遍历集合 获取每个菜品 设置信息
        if (CollUtil.isNotEmpty(setmealDishes)) {
            setmealDishes.forEach(sd->{
                // 设置信息
                sd.setSetmealId(setmealDto.getId());
                sd.setSort(0);

                sd.setCreateUser(setmealDto.getCreateUser());
                sd.setUpdateUser(setmealDto.getUpdateUser());
                sd.setCreateTime(setmealDto.getCreateTime());
                sd.setUpdateTime(setmealDto.getUpdateTime());
            });
        }

        // 2.3 保存
        setmealDishMapper.batchSave(setmealDishes);

        return R.success(null);
    }


    @Override
    public R findByPage(Integer pageNum, Integer pageSize, String name) {
        // 1 先查询套餐分类信息 list
        List<Category> categoryList = categoryMapper.findAllByType(2);
        // 2 把list转成map  key value  分类id  分类名称
        Map<Long,String> categoryMap = new HashMap<>();
        categoryList.forEach(c -> {
            categoryMap.put(c.getId(),c.getName());
        });
        // 3 设置分类参数
        PageHelper.startPage(pageNum,pageSize);
        // 4 查询所有 用name查询
        List<Setmeal> list = setmealMapper.findAll(name);
        // 5 封装pageInfo 获取总记录数
        PageInfo<Setmeal> pageInfo = new PageInfo<>(list);
        // 6 新建套餐集合
        List<SetmealDto> dtoList = new ArrayList<>();
        // 7 遍历套餐集合获取每个套餐 设置每个dto分类名称 最后封装到setmealDto中
        if (CollUtil.isNotEmpty(list)) {
            list.forEach(s->{
                SetmealDto dto = new SetmealDto();
                BeanUtils.copyProperties(s,dto);
                dto.setCategoryName(categoryMap.get(s.getCategoryId()));
                dtoList.add(dto);
            });
        }

        return R.success(new Page<>(dtoList,pageInfo.getTotal()));
    }

    @Override
    @Transactional
    public R delete(Long[] ids) {
        // 1 非空判断
        if (ArrayUtil.isEmpty(ids)) {
            throw new BusinessException("请选择要删除的套餐");
        }

        // 2 判断是否有启动的套餐 若有不可能删除
        List<Setmeal> list = setmealMapper.findOnSaleByIds(ids);
        if (CollUtil.isNotEmpty(list)) {
            throw new BusinessException("请先停售套餐再删除");
        }

        // 3 若都停售了删除setmeal中的数据
        setmealMapper.batchDelete(ids);

        // 4 删除setmeal_dish中的数据
        setmealDishMapper.batchDeleteBySetmealIds(ids);

        return R.success(null);
    }

    @Override
    public R findOnSaleByCategoryId(Long categoryId, Integer status) {
        List<Setmeal> list = setmealMapper.findByCategoryIdAndStatus(categoryId,status);
        return R.success(list);
    }
}
